🎖️GitЯра🎖️
Node / meshtastic / Meshtastic-Android / files / app / src / main / java / com / geeksville / mesh / repository / radio / MockInterface.kt
Displaying Raw • Download
app/src/main/java/com/geeksville/mesh/repository/radio/MockInterface.kt 78274c792318331b11ab64cd28e58e829875b8c2 (78274c79) Text, 15.40 KB
T8b949e/*
* Copyright (c) 2025 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787com.geeksville.mesh.repository.radio
Tff7b72import T7ee787com.geeksville.mesh.concurrent.handledLaunch
Tff7b72import T7ee787com.geeksville.mesh.model.getInitials
Tff7b72import T7ee787com.google.protobuf.ByteString
Tff7b72import T7ee787dagger.assisted.Assisted
Tff7b72import T7ee787dagger.assisted.AssistedInject
Tff7b72import T7ee787kotlinx.coroutines.delay
Tff7b72import T7ee787org.meshtastic.core.model.Channel
Tff7b72import T7ee787org.meshtastic.core.model.DataPacket
Tff7b72import T7ee787org.meshtastic.core.model.Position
Tff7b72import T7ee787org.meshtastic.proto.AdminProtos
Tff7b72import T7ee787org.meshtastic.proto.ChannelProtos
Tff7b72import T7ee787org.meshtastic.proto.ConfigKt
Tff7b72import T7ee787org.meshtastic.proto.ConfigProtos
Tff7b72import T7ee787org.meshtastic.proto.MeshProtos
Tff7b72import T7ee787org.meshtastic.proto.Portnums
Tff7b72import T7ee787org.meshtastic.proto.TelemetryProtos
Tff7b72import T7ee787org.meshtastic.proto.channel
Tff7b72import T7ee787org.meshtastic.proto.config
Tff7b72import T7ee787org.meshtastic.proto.deviceMetadata
Tff7b72import T7ee787org.meshtastic.proto.fromRadio
Tff7b72import T7ee787org.meshtastic.proto.queueStatus
Tff7b72import T7ee787timber.log.Timber
Tff7b72import T7ee787kotlin.random.Random
Tff7b72private Tff7b72val Te6edf3defaultLoRaConfig Tff7b72=
Te6edf3ConfigKtTb4b4b4.Te6edf3loRaConfig Tb4b4b4{
Te6edf3usePreset Tff7b72= Tff7b72true
Te6edf3region Tff7b72= Te6edf3ConfigProtosTb4b4b4.Te6edf3ConfigTb4b4b4.Te6edf3LoRaConfigTb4b4b4.Te6edf3RegionCodeTb4b4b4.Te6edf3TW
Tb4b4b4}
Tff7b72private Tff7b72val Te6edf3defaultChannel Tff7b72= Te6edf3channel Tb4b4b4{
Te6edf3settings Tff7b72= Te6edf3ChannelTb4b4b4.Te6edf3defaultTb4b4b4.Te6edf3settings
Te6edf3role Tff7b72= Te6edf3ChannelProtosTb4b4b4.Te6edf3ChannelTb4b4b4.Te6edf3RoleTb4b4b4.Te6edf3PRIMARY
Tb4b4b4}
T8b949e/** A simulated interface that is used for testing in the simulator */
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffdetekt:TooManyFunctionsTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffdetekt:MagicNumberTa5d6ff"Tb4b4b4)
Tff7b72class T56d364MockInterface
Tf0883e@AssistedInject
Tff7b72constructorTb4b4b4(
Tff7b72private Tff7b72val Te6edf3serviceTb4b4b4: Te6edf3RadioInterfaceServiceTb4b4b4,
Tf0883e@Assisted Tff7b72val Te6edf3addressTb4b4b4: Tffa657StringTb4b4b4,
Tb4b4b4) Tb4b4b4: Te6edf3IRadioInterface Tb4b4b4{
Tff7b72companion Tff7b72object Tb4b4b4{
Tff7b72private Tff7b72const Tff7b72val Te6edf3MY_NODE Tff7b72= T79c0ff0Te6edf3x42424242
Tb4b4b4}
Tff7b72private Tff7b72var Te6edf3currentPacketId Tff7b72= T79c0ff5T79c0ff0
T8b949e// an infinite sequence of ints
Tff7b72private Tff7b72val Te6edf3packetIdSequence Tff7b72= Te6edf3generateSequence Tb4b4b4{ Te6edf3currentPacketIdTff7b72+Tff7b72+ Tb4b4b4}Tb4b4b4.Te6edf3iteratorTb4b4b4(Tb4b4b4)
Tff7b72init Tb4b4b4{
Te6edf3TimberTb4b4b4.Te6edf3iTb4b4b4(Ta5d6ff"Ta5d6ffStarting the mock interfaceTa5d6ff"Tb4b4b4)
Te6edf3serviceTb4b4b4.Te6edf3onConnectTb4b4b4(Tb4b4b4) T8b949e// Tell clients they can use the API
Tb4b4b4}
Tff7b72override Tff7b72fun Td2a8ffhandleSendToRadioTb4b4b4(Te6edf3pTb4b4b4: Te6edf3ByteArrayTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3pr Tff7b72= Te6edf3MeshProtosTb4b4b4.Te6edf3ToRadioTb4b4b4.Te6edf3parseFromTb4b4b4(Te6edf3pTb4b4b4)
Te6edf3sendQueueStatusTb4b4b4(Te6edf3prTb4b4b4.Te6edf3packetTb4b4b4.Te6edf3idTb4b4b4)
Tff7b72val Te6edf3data Tff7b72= Tff7b72if Tb4b4b4(Te6edf3prTb4b4b4.Te6edf3hasPacketTb4b4b4(Tb4b4b4)Tb4b4b4) Te6edf3prTb4b4b4.Te6edf3packetTb4b4b4.Te6edf3decoded Tff7b72else Tff7b72null
Tff7b72when Tb4b4b4{
Te6edf3prTb4b4b4.Te6edf3wantConfigId Tff7b72!Tff7b72= T79c0ff0 Tff7b72-Tff7b72> Te6edf3sendConfigResponseTb4b4b4(Te6edf3prTb4b4b4.Te6edf3wantConfigIdTb4b4b4)
Te6edf3data Tff7b72!Tff7b72= Tff7b72null Tff7b72&Tff7b72& Te6edf3dataTb4b4b4.Te6edf3portnum Tff7b72=Tff7b72= Te6edf3PortnumsTb4b4b4.Te6edf3PortNumTb4b4b4.Te6edf3ADMIN_APP Tff7b72-Tff7b72>
Te6edf3handleAdminPacketTb4b4b4(Te6edf3prTb4b4b4, Te6edf3AdminProtosTb4b4b4.Te6edf3AdminMessageTb4b4b4.Te6edf3parseFromTb4b4b4(Te6edf3dataTb4b4b4.Te6edf3payloadTb4b4b4)Tb4b4b4)
Te6edf3prTb4b4b4.Te6edf3hasPacketTb4b4b4(Tb4b4b4) Tff7b72&Tff7b72& Te6edf3prTb4b4b4.Te6edf3packetTb4b4b4.Te6edf3wantAck Tff7b72-Tff7b72> Te6edf3sendFakeAckTb4b4b4(Te6edf3prTb4b4b4)
Tff7b72else Tff7b72-Tff7b72> Te6edf3TimberTb4b4b4.Te6edf3iTb4b4b4(Ta5d6ff"Ta5d6ffIgnoring data sent to mock interface Tffd700$Te6edf3prTa5d6ff"Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72private Tff7b72fun Td2a8ffhandleAdminPacketTb4b4b4(Te6edf3prTb4b4b4: Te6edf3MeshProtosTb4b4b4.Te6edf3ToRadioTb4b4b4, Te6edf3dTb4b4b4: Te6edf3AdminProtosTb4b4b4.Te6edf3AdminMessageTb4b4b4) Tb4b4b4{
Tff7b72when Tb4b4b4{
Te6edf3dTb4b4b4.Te6edf3getConfigRequest Tff7b72=Tff7b72= Te6edf3AdminProtosTb4b4b4.Te6edf3AdminMessageTb4b4b4.Te6edf3ConfigTypeTb4b4b4.Te6edf3LORA_CONFIG Tff7b72-Tff7b72>
Te6edf3sendAdminTb4b4b4(Te6edf3prTb4b4b4.Te6edf3packetTb4b4b4.Te6edf3toTb4b4b4, Te6edf3prTb4b4b4.Te6edf3packetTb4b4b4.Te6edf3fromTb4b4b4, Te6edf3prTb4b4b4.Te6edf3packetTb4b4b4.Te6edf3idTb4b4b4) Tb4b4b4{
Te6edf3getConfigResponse Tff7b72= Te6edf3config Tb4b4b4{ Te6edf3lora Tff7b72= Te6edf3defaultLoRaConfig Tb4b4b4}
Tb4b4b4}
Te6edf3dTb4b4b4.Te6edf3getChannelRequest Tff7b72!Tff7b72= T79c0ff0 Tff7b72-Tff7b72>
Te6edf3sendAdminTb4b4b4(Te6edf3prTb4b4b4.Te6edf3packetTb4b4b4.Te6edf3toTb4b4b4, Te6edf3prTb4b4b4.Te6edf3packetTb4b4b4.Te6edf3fromTb4b4b4, Te6edf3prTb4b4b4.Te6edf3packetTb4b4b4.Te6edf3idTb4b4b4) Tb4b4b4{
Te6edf3getChannelResponse Tff7b72= Te6edf3channel Tb4b4b4{
Te6edf3index Tff7b72= Te6edf3dTb4b4b4.Te6edf3getChannelRequest Tff7b72- T79c0ff1 T8b949e// 0 based on the response
Tff7b72if Tb4b4b4(Te6edf3dTb4b4b4.Te6edf3getChannelRequest Tff7b72=Tff7b72= T79c0ff1Tb4b4b4) Tb4b4b4{
Te6edf3settings Tff7b72= Te6edf3ChannelTb4b4b4.Te6edf3defaultTb4b4b4.Te6edf3settings
Te6edf3role Tff7b72= Te6edf3ChannelProtosTb4b4b4.Te6edf3ChannelTb4b4b4.Te6edf3RoleTb4b4b4.Te6edf3PRIMARY
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tff7b72else Tff7b72-Tff7b72> Te6edf3TimberTb4b4b4.Te6edf3iTb4b4b4(Ta5d6ff"Ta5d6ffIgnoring admin sent to mock interface Tffd700$Te6edf3dTa5d6ff"Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72override Tff7b72fun Td2a8ffcloseTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3TimberTb4b4b4.Te6edf3iTb4b4b4(Ta5d6ff"Ta5d6ffClosing the mock interfaceTa5d6ff"Tb4b4b4)
Tb4b4b4}
T8b949e// / Generate a fake text message from a node
Tff7b72private Tff7b72fun Td2a8ffmakeTextMessageTb4b4b4(Te6edf3numInTb4b4b4: Tffa657IntTb4b4b4) Tff7b72= Te6edf3MeshProtosTb4b4b4.Te6edf3FromRadioTb4b4b4.Te6edf3newBuilderTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{
Te6edf3packet Tff7b72=
Te6edf3MeshProtosTb4b4b4.Te6edf3MeshPacketTb4b4b4.Te6edf3newBuilderTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3apply Tb4b4b4{
Te6edf3id Tff7b72= Te6edf3packetIdSequenceTb4b4b4.Te6edf3nextTb4b4b4(Tb4b4b4)
Te6edf3from Tff7b72= Te6edf3numIn
Te6edf3to Tff7b72= T79c0ff0Te6edf3xffffffffTb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4) T8b949e// ugly way of saying broadcast
Te6edf3rxTime Tff7b72= Tb4b4b4(Te6edf3SystemTb4b4b4.Te6edf3currentTimeMillisTb4b4b4(Tb4b4b4) Tff7b72/ T79c0ff1T79c0ff0T79c0ff0T79c0ff0Tb4b4b4)Tb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)
Te6edf3rxSnr Tff7b72= T79c0ff1.5f
Te6edf3decoded Tff7b72=
Te6edf3MeshProtosTb4b4b4.Te6edf3DataTb4b4b4.Te6edf3newBuilderTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3apply Tb4b4b4{
Te6edf3portnum Tff7b72= Te6edf3PortnumsTb4b4b4.Te6edf3PortNumTb4b4b4.Te6edf3TEXT_MESSAGE_APP
Te6edf3payload Tff7b72= Te6edf3ByteStringTb4b4b4.Te6edf3copyFromUtf8Tb4b4b4(Ta5d6ff"Ta5d6ffThis simulated node sends Hi!Ta5d6ff"Tb4b4b4)
Tb4b4b4}
Tb4b4b4.Te6edf3buildTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4.Te6edf3buildTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tff7b72private Tff7b72fun Td2a8ffmakeNeighborInfoTb4b4b4(Te6edf3numInTb4b4b4: Tffa657IntTb4b4b4) Tff7b72= Te6edf3MeshProtosTb4b4b4.Te6edf3FromRadioTb4b4b4.Te6edf3newBuilderTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{
Te6edf3packet Tff7b72=
Te6edf3MeshProtosTb4b4b4.Te6edf3MeshPacketTb4b4b4.Te6edf3newBuilderTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3apply Tb4b4b4{
Te6edf3id Tff7b72= Te6edf3packetIdSequenceTb4b4b4.Te6edf3nextTb4b4b4(Tb4b4b4)
Te6edf3from Tff7b72= Te6edf3numIn
Te6edf3to Tff7b72= T79c0ff0Te6edf3xffffffffTb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4) T8b949e// broadcast
Te6edf3rxTime Tff7b72= Tb4b4b4(Te6edf3SystemTb4b4b4.Te6edf3currentTimeMillisTb4b4b4(Tb4b4b4) Tff7b72/ T79c0ff1T79c0ff0T79c0ff0T79c0ff0Tb4b4b4)Tb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)
Te6edf3rxSnr Tff7b72= T79c0ff1.5f
Te6edf3decoded Tff7b72=
Te6edf3MeshProtosTb4b4b4.Te6edf3DataTb4b4b4.Te6edf3newBuilderTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3apply Tb4b4b4{
Te6edf3portnum Tff7b72= Te6edf3PortnumsTb4b4b4.Te6edf3PortNumTb4b4b4.Te6edf3NEIGHBORINFO_APP
Te6edf3payload Tff7b72=
Te6edf3MeshProtosTb4b4b4.Te6edf3NeighborInfoTb4b4b4.Te6edf3newBuilderTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3setNodeIdTb4b4b4(Te6edf3numInTb4b4b4)
Tb4b4b4.Te6edf3setLastSentByIdTb4b4b4(Te6edf3numInTb4b4b4)
Tb4b4b4.Te6edf3setNodeBroadcastIntervalSecsTb4b4b4(T79c0ff6T79c0ff0Tb4b4b4)
Tb4b4b4.Te6edf3addNeighborsTb4b4b4(
Te6edf3MeshProtosTb4b4b4.Te6edf3NeighborTb4b4b4.Te6edf3newBuilderTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3setNodeIdTb4b4b4(Te6edf3numIn Tff7b72+ T79c0ff1Tb4b4b4)
Tb4b4b4.Te6edf3setSnrTb4b4b4(T79c0ff1T79c0ff0.0fTb4b4b4)
Tb4b4b4.Te6edf3setLastRxTimeTb4b4b4(Tb4b4b4(Te6edf3SystemTb4b4b4.Te6edf3currentTimeMillisTb4b4b4(Tb4b4b4) Tff7b72/ T79c0ff1T79c0ff0T79c0ff0T79c0ff0Tb4b4b4)Tb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4.Te6edf3setNodeBroadcastIntervalSecsTb4b4b4(T79c0ff6T79c0ff0Tb4b4b4)
Tb4b4b4.Te6edf3buildTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4.Te6edf3addNeighborsTb4b4b4(
Te6edf3MeshProtosTb4b4b4.Te6edf3NeighborTb4b4b4.Te6edf3newBuilderTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3setNodeIdTb4b4b4(Te6edf3numIn Tff7b72+ T79c0ff2Tb4b4b4)
Tb4b4b4.Te6edf3setSnrTb4b4b4(T79c0ff1T79c0ff2.0fTb4b4b4)
Tb4b4b4.Te6edf3setLastRxTimeTb4b4b4(Tb4b4b4(Te6edf3SystemTb4b4b4.Te6edf3currentTimeMillisTb4b4b4(Tb4b4b4) Tff7b72/ T79c0ff1T79c0ff0T79c0ff0T79c0ff0Tb4b4b4)Tb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4.Te6edf3setNodeBroadcastIntervalSecsTb4b4b4(T79c0ff6T79c0ff0Tb4b4b4)
Tb4b4b4.Te6edf3buildTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4.Te6edf3buildTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3toByteStringTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4.Te6edf3buildTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4.Te6edf3buildTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tff7b72private Tff7b72fun Td2a8ffmakePositionTb4b4b4(Te6edf3numInTb4b4b4: Tffa657IntTb4b4b4) Tff7b72= Te6edf3MeshProtosTb4b4b4.Te6edf3FromRadioTb4b4b4.Te6edf3newBuilderTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{
Te6edf3packet Tff7b72=
Te6edf3MeshProtosTb4b4b4.Te6edf3MeshPacketTb4b4b4.Te6edf3newBuilderTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3apply Tb4b4b4{
Te6edf3id Tff7b72= Te6edf3packetIdSequenceTb4b4b4.Te6edf3nextTb4b4b4(Tb4b4b4)
Te6edf3from Tff7b72= Te6edf3numIn
Te6edf3to Tff7b72= T79c0ff0Te6edf3xffffffffTb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4) T8b949e// ugly way of saying broadcast
Te6edf3rxTime Tff7b72= Tb4b4b4(Te6edf3SystemTb4b4b4.Te6edf3currentTimeMillisTb4b4b4(Tb4b4b4) Tff7b72/ T79c0ff1T79c0ff0T79c0ff0T79c0ff0Tb4b4b4)Tb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)
Te6edf3rxSnr Tff7b72= T79c0ff1.5f
Te6edf3decoded Tff7b72=
Te6edf3MeshProtosTb4b4b4.Te6edf3DataTb4b4b4.Te6edf3newBuilderTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3apply Tb4b4b4{
Te6edf3portnum Tff7b72= Te6edf3PortnumsTb4b4b4.Te6edf3PortNumTb4b4b4.Te6edf3POSITION_APP
Te6edf3payload Tff7b72=
Te6edf3MeshProtosTb4b4b4.Te6edf3PositionTb4b4b4.Te6edf3newBuilderTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3setLatitudeITb4b4b4(Te6edf3PositionTb4b4b4.Te6edf3degITb4b4b4(T79c0ff3T79c0ff2.776665Tb4b4b4)Tb4b4b4)
Tb4b4b4.Te6edf3setLongitudeITb4b4b4(Te6edf3PositionTb4b4b4.Te6edf3degITb4b4b4(Tff7b72-T79c0ff9T79c0ff6.796989Tb4b4b4)Tb4b4b4)
Tb4b4b4.Te6edf3setAltitudeTb4b4b4(T79c0ff1T79c0ff5T79c0ff0Tb4b4b4)
Tb4b4b4.Te6edf3setTimeTb4b4b4(Tb4b4b4(Te6edf3SystemTb4b4b4.Te6edf3currentTimeMillisTb4b4b4(Tb4b4b4) Tff7b72/ T79c0ff1T79c0ff0T79c0ff0T79c0ff0Tb4b4b4)Tb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4.Te6edf3setPrecisionBitsTb4b4b4(T79c0ff1T79c0ff5Tb4b4b4)
Tb4b4b4.Te6edf3buildTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3toByteStringTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4.Te6edf3buildTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4.Te6edf3buildTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tff7b72private Tff7b72fun Td2a8ffmakeTelemetryTb4b4b4(Te6edf3numInTb4b4b4: Tffa657IntTb4b4b4) Tff7b72= Te6edf3MeshProtosTb4b4b4.Te6edf3FromRadioTb4b4b4.Te6edf3newBuilderTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{
Te6edf3packet Tff7b72=
Te6edf3MeshProtosTb4b4b4.Te6edf3MeshPacketTb4b4b4.Te6edf3newBuilderTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3apply Tb4b4b4{
Te6edf3id Tff7b72= Te6edf3packetIdSequenceTb4b4b4.Te6edf3nextTb4b4b4(Tb4b4b4)
Te6edf3from Tff7b72= Te6edf3numIn
Te6edf3to Tff7b72= T79c0ff0Te6edf3xffffffffTb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4) T8b949e// broadcast
Te6edf3rxTime Tff7b72= Tb4b4b4(Te6edf3SystemTb4b4b4.Te6edf3currentTimeMillisTb4b4b4(Tb4b4b4) Tff7b72/ T79c0ff1T79c0ff0T79c0ff0T79c0ff0Tb4b4b4)Tb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)
Te6edf3rxSnr Tff7b72= T79c0ff1.5f
Te6edf3decoded Tff7b72=
Te6edf3MeshProtosTb4b4b4.Te6edf3DataTb4b4b4.Te6edf3newBuilderTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3apply Tb4b4b4{
Te6edf3portnum Tff7b72= Te6edf3PortnumsTb4b4b4.Te6edf3PortNumTb4b4b4.Te6edf3TELEMETRY_APP
Te6edf3payload Tff7b72=
Te6edf3TelemetryProtosTb4b4b4.Te6edf3TelemetryTb4b4b4.Te6edf3newBuilderTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3setTimeTb4b4b4(Tb4b4b4(Te6edf3SystemTb4b4b4.Te6edf3currentTimeMillisTb4b4b4(Tb4b4b4) Tff7b72/ T79c0ff1T79c0ff0T79c0ff0T79c0ff0Tb4b4b4)Tb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4.Te6edf3setDeviceMetricsTb4b4b4(
Te6edf3TelemetryProtosTb4b4b4.Te6edf3DeviceMetricsTb4b4b4.Te6edf3newBuilderTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3setBatteryLevelTb4b4b4(T79c0ff8T79c0ff5Tb4b4b4)
Tb4b4b4.Te6edf3setVoltageTb4b4b4(T79c0ff4.1fTb4b4b4)
Tb4b4b4.Te6edf3setChannelUtilizationTb4b4b4(T79c0ff0.12fTb4b4b4)
Tb4b4b4.Te6edf3setAirUtilTxTb4b4b4(T79c0ff0.05fTb4b4b4)
Tb4b4b4.Te6edf3setUptimeSecondsTb4b4b4(T79c0ff1T79c0ff2T79c0ff3T79c0ff4T79c0ff5T79c0ff6Tb4b4b4)
Tb4b4b4.Te6edf3buildTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4.Te6edf3buildTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3toByteStringTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4.Te6edf3buildTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4.Te6edf3buildTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tff7b72private Tff7b72fun Td2a8ffmakeDataPacketTb4b4b4(Te6edf3fromInTb4b4b4: Tffa657IntTb4b4b4, Te6edf3toInTb4b4b4: Tffa657IntTb4b4b4, Te6edf3dataTb4b4b4: Te6edf3MeshProtosTb4b4b4.Te6edf3DataTb4b4b4.Te6edf3BuilderTb4b4b4) Tff7b72=
Te6edf3MeshProtosTb4b4b4.Te6edf3FromRadioTb4b4b4.Te6edf3newBuilderTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{
Te6edf3packet Tff7b72=
Te6edf3MeshProtosTb4b4b4.Te6edf3MeshPacketTb4b4b4.Te6edf3newBuilderTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3apply Tb4b4b4{
Te6edf3id Tff7b72= Te6edf3packetIdSequenceTb4b4b4.Te6edf3nextTb4b4b4(Tb4b4b4)
Te6edf3from Tff7b72= Te6edf3fromIn
Te6edf3to Tff7b72= Te6edf3toIn
Te6edf3rxTime Tff7b72= Tb4b4b4(Te6edf3SystemTb4b4b4.Te6edf3currentTimeMillisTb4b4b4(Tb4b4b4) Tff7b72/ T79c0ff1T79c0ff0T79c0ff0T79c0ff0Tb4b4b4)Tb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)
Te6edf3rxSnr Tff7b72= T79c0ff1.5f
Te6edf3decoded Tff7b72= Te6edf3dataTb4b4b4.Te6edf3buildTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4.Te6edf3buildTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tff7b72private Tff7b72fun Td2a8ffmakeAckTb4b4b4(Te6edf3fromInTb4b4b4: Tffa657IntTb4b4b4, Te6edf3toInTb4b4b4: Tffa657IntTb4b4b4, Te6edf3msgIdTb4b4b4: Tffa657IntTb4b4b4) Tff7b72= Te6edf3makeDataPacketTb4b4b4(
Te6edf3fromInTb4b4b4,
Te6edf3toInTb4b4b4,
Te6edf3MeshProtosTb4b4b4.Te6edf3DataTb4b4b4.Te6edf3newBuilderTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{
Te6edf3portnum Tff7b72= Te6edf3PortnumsTb4b4b4.Te6edf3PortNumTb4b4b4.Te6edf3ROUTING_APP
Te6edf3payload Tff7b72= Te6edf3MeshProtosTb4b4b4.Te6edf3RoutingTb4b4b4.Te6edf3newBuilderTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{Tb4b4b4}Tb4b4b4.Te6edf3buildTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3toByteStringTb4b4b4(Tb4b4b4)
Te6edf3requestId Tff7b72= Te6edf3msgId
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tff7b72private Tff7b72fun Td2a8ffsendQueueStatusTb4b4b4(Te6edf3msgIdTb4b4b4: Tffa657IntTb4b4b4) Tff7b72= Te6edf3serviceTb4b4b4.Te6edf3handleFromRadioTb4b4b4(
Te6edf3fromRadio Tb4b4b4{
Te6edf3queueStatus Tff7b72= Te6edf3queueStatus Tb4b4b4{
Te6edf3res Tff7b72= T79c0ff0
Te6edf3free Tff7b72= T79c0ff1T79c0ff6
Te6edf3meshPacketId Tff7b72= Te6edf3msgId
Tb4b4b4}
Tb4b4b4}
Tb4b4b4.Te6edf3toByteArrayTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72private Tff7b72fun Td2a8ffsendAdminTb4b4b4(Te6edf3fromInTb4b4b4: Tffa657IntTb4b4b4, Te6edf3toInTb4b4b4: Tffa657IntTb4b4b4, Te6edf3reqIdTb4b4b4: Tffa657IntTb4b4b4, Te6edf3initFnTb4b4b4: Te6edf3AdminProtosTb4b4b4.Te6edf3AdminMessageTb4b4b4.Te6edf3BuilderTb4b4b4.Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3p Tff7b72=
Te6edf3makeDataPacketTb4b4b4(
Te6edf3fromInTb4b4b4,
Te6edf3toInTb4b4b4,
Te6edf3MeshProtosTb4b4b4.Te6edf3DataTb4b4b4.Te6edf3newBuilderTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{
Te6edf3portnum Tff7b72= Te6edf3PortnumsTb4b4b4.Te6edf3PortNumTb4b4b4.Te6edf3ADMIN_APP
Te6edf3payload Tff7b72= Te6edf3AdminProtosTb4b4b4.Te6edf3AdminMessageTb4b4b4.Te6edf3newBuilderTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3also Tb4b4b4{ Te6edf3initFnTb4b4b4(Tffa657itTb4b4b4) Tb4b4b4}Tb4b4b4.Te6edf3buildTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3toByteStringTb4b4b4(Tb4b4b4)
Te6edf3requestId Tff7b72= Te6edf3reqId
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Te6edf3serviceTb4b4b4.Te6edf3handleFromRadioTb4b4b4(Te6edf3pTb4b4b4.Te6edf3buildTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3toByteArrayTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4}
T8b949e// / Send a fake ack packet back if the sender asked for want_ack
Tff7b72private Tff7b72fun Td2a8ffsendFakeAckTb4b4b4(Te6edf3prTb4b4b4: Te6edf3MeshProtosTb4b4b4.Te6edf3ToRadioTb4b4b4) Tff7b72= Te6edf3serviceTb4b4b4.Te6edf3serviceScopeTb4b4b4.Te6edf3handledLaunch Tb4b4b4{
Te6edf3delayTb4b4b4(T79c0ff2T79c0ff0T79c0ff0T79c0ff0Tb4b4b4)
Te6edf3serviceTb4b4b4.Te6edf3handleFromRadioTb4b4b4(Te6edf3makeAckTb4b4b4(Te6edf3MY_NODE Tff7b72+ T79c0ff1Tb4b4b4, Te6edf3prTb4b4b4.Te6edf3packetTb4b4b4.Te6edf3fromTb4b4b4, Te6edf3prTb4b4b4.Te6edf3packetTb4b4b4.Te6edf3idTb4b4b4)Tb4b4b4.Te6edf3buildTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3toByteArrayTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4}
Tff7b72private Tff7b72fun Td2a8ffsendConfigResponseTb4b4b4(Te6edf3configIdTb4b4b4: Tffa657IntTb4b4b4) Tb4b4b4{
Te6edf3TimberTb4b4b4.Te6edf3dTb4b4b4(Ta5d6ff"Ta5d6ffSending mock config responseTa5d6ff"Tb4b4b4)
T8b949e// / Generate a fake node info entry
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffMagicNumberTa5d6ff"Tb4b4b4)
Tff7b72fun Td2a8ffmakeNodeInfoTb4b4b4(Te6edf3numInTb4b4b4: Tffa657IntTb4b4b4, Te6edf3latTb4b4b4: Tffa657DoubleTb4b4b4, Te6edf3lonTb4b4b4: Tffa657DoubleTb4b4b4) Tff7b72= Te6edf3MeshProtosTb4b4b4.Te6edf3FromRadioTb4b4b4.Te6edf3newBuilderTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{
Te6edf3nodeInfo Tff7b72=
Te6edf3MeshProtosTb4b4b4.Te6edf3NodeInfoTb4b4b4.Te6edf3newBuilderTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3apply Tb4b4b4{
Te6edf3num Tff7b72= Te6edf3numIn
Te6edf3user Tff7b72=
Te6edf3MeshProtosTb4b4b4.Te6edf3UserTb4b4b4.Te6edf3newBuilderTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3apply Tb4b4b4{
Te6edf3id Tff7b72= Te6edf3DataPacketTb4b4b4.Te6edf3nodeNumToDefaultIdTb4b4b4(Te6edf3numInTb4b4b4)
Te6edf3longName Tff7b72= Ta5d6ff"Ta5d6ffSim Ta5d6ff" Tff7b72+ Te6edf3IntegerTb4b4b4.Te6edf3toHexStringTb4b4b4(Te6edf3numTb4b4b4)
Te6edf3shortName Tff7b72= Te6edf3getInitialsTb4b4b4(Te6edf3longNameTb4b4b4)
Te6edf3hwModel Tff7b72= Te6edf3MeshProtosTb4b4b4.Te6edf3HardwareModelTb4b4b4.Te6edf3ANDROID_SIM
Tb4b4b4}
Tb4b4b4.Te6edf3buildTb4b4b4(Tb4b4b4)
Te6edf3position Tff7b72=
Te6edf3MeshProtosTb4b4b4.Te6edf3PositionTb4b4b4.Te6edf3newBuilderTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3apply Tb4b4b4{
Te6edf3latitudeI Tff7b72= Te6edf3PositionTb4b4b4.Te6edf3degITb4b4b4(Te6edf3latTb4b4b4)
Te6edf3longitudeI Tff7b72= Te6edf3PositionTb4b4b4.Te6edf3degITb4b4b4(Te6edf3lonTb4b4b4)
Te6edf3altitude Tff7b72= T79c0ff3T79c0ff5
Te6edf3time Tff7b72= Tb4b4b4(Te6edf3SystemTb4b4b4.Te6edf3currentTimeMillisTb4b4b4(Tb4b4b4) Tff7b72/ T79c0ff1T79c0ff0T79c0ff0T79c0ff0Tb4b4b4)Tb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)
Te6edf3precisionBits Tff7b72= Te6edf3RandomTb4b4b4.Te6edf3nextIntTb4b4b4(T79c0ff1T79c0ff0Tb4b4b4, T79c0ff1T79c0ff9Tb4b4b4)
Tb4b4b4}
Tb4b4b4.Te6edf3buildTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4.Te6edf3buildTb4b4b4(Tb4b4b4)
Tb4b4b4}
T8b949e// Simulated network data to feed to our app
Tff7b72val Te6edf3packets Tff7b72=
Te6edf3arrayOfTb4b4b4(
T8b949e// MyNodeInfo
Te6edf3MeshProtosTb4b4b4.Te6edf3FromRadioTb4b4b4.Te6edf3newBuilderTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{
Te6edf3myInfo Tff7b72= Te6edf3MeshProtosTb4b4b4.Te6edf3MyNodeInfoTb4b4b4.Te6edf3newBuilderTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{ Te6edf3myNodeNum Tff7b72= Te6edf3MY_NODE Tb4b4b4}Tb4b4b4.Te6edf3buildTb4b4b4(Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Te6edf3MeshProtosTb4b4b4.Te6edf3FromRadioTb4b4b4.Te6edf3newBuilderTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{
Te6edf3metadata Tff7b72= Te6edf3deviceMetadata Tb4b4b4{
Te6edf3firmwareVersion Tff7b72= Ta5d6ff"Ta5d6ff9.9.9.abcdefgTa5d6ff"
Te6edf3hwModel Tff7b72= Te6edf3MeshProtosTb4b4b4.Te6edf3HardwareModelTb4b4b4.Te6edf3ANDROID_SIM
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
T8b949e// Fake NodeDB
Te6edf3makeNodeInfoTb4b4b4(Te6edf3MY_NODETb4b4b4, T79c0ff3T79c0ff2.776665Tb4b4b4, Tff7b72-T79c0ff9T79c0ff6.796989Tb4b4b4)Tb4b4b4, T8b949e// dallas
Te6edf3makeNodeInfoTb4b4b4(Te6edf3MY_NODE Tff7b72+ T79c0ff1Tb4b4b4, T79c0ff3T79c0ff2.960758Tb4b4b4, Tff7b72-T79c0ff9T79c0ff6.733521Tb4b4b4)Tb4b4b4, T8b949e// richardson
Te6edf3MeshProtosTb4b4b4.Te6edf3FromRadioTb4b4b4.Te6edf3newBuilderTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{ Te6edf3config Tff7b72= Te6edf3config Tb4b4b4{ Te6edf3lora Tff7b72= Te6edf3defaultLoRaConfig Tb4b4b4} Tb4b4b4}Tb4b4b4,
Te6edf3MeshProtosTb4b4b4.Te6edf3FromRadioTb4b4b4.Te6edf3newBuilderTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{ Te6edf3channel Tff7b72= Te6edf3defaultChannel Tb4b4b4}Tb4b4b4,
Te6edf3MeshProtosTb4b4b4.Te6edf3FromRadioTb4b4b4.Te6edf3newBuilderTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{ Te6edf3configCompleteId Tff7b72= Te6edf3configId Tb4b4b4}Tb4b4b4,
T8b949e// Done with config response, now pretend to receive some text messages
Te6edf3makeTextMessageTb4b4b4(Te6edf3MY_NODE Tff7b72+ T79c0ff1Tb4b4b4)Tb4b4b4,
Te6edf3makeNeighborInfoTb4b4b4(Te6edf3MY_NODE Tff7b72+ T79c0ff1Tb4b4b4)Tb4b4b4,
Te6edf3makePositionTb4b4b4(Te6edf3MY_NODE Tff7b72+ T79c0ff1Tb4b4b4)Tb4b4b4,
Te6edf3makeTelemetryTb4b4b4(Te6edf3MY_NODE Tff7b72+ T79c0ff1Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3packetsTb4b4b4.Te6edf3forEach Tb4b4b4{ Te6edf3p Tff7b72-Tff7b72> Te6edf3serviceTb4b4b4.Te6edf3handleFromRadioTb4b4b4(Te6edf3pTb4b4b4.Te6edf3buildTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3toByteArrayTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Served by rngit 1.5.0 - Generated in 0.23s